{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Copyright 2021-2023 @ Shenzhen Bay Laboratory & Peking University & Huawei Technologies Co., Ltd\n",
    "\n",
    "This code is a part of MindSPONGE:\n",
    "MindSpore Simulation Package tOwards Next Generation molecular modelling.\n",
    "\n",
    "MindSPONGE is open-source software based on the AI-framework:\n",
    "MindSpore (https://www.mindspore.cn/)\n",
    "\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "you may not use this file except in compliance with the License.\n",
    "\n",
    "You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n",
    "\n",
    "Unless required by applicable law or agreed to in writing, software\n",
    "distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "\n",
    "See the License for the specific language governing permissions and\n",
    "limitations under the License.\n",
    "\n",
    "MindSPONGE advanced tutorial 02: Bias potential and metadynamics (MetaD)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from mindspore import context\n",
    "from mindsponge import Sponge\n",
    "from mindsponge import ForceField\n",
    "from mindsponge import set_global_units\n",
    "from mindsponge import Protein\n",
    "from mindsponge import WithEnergyCell\n",
    "from mindsponge import UpdaterMD\n",
    "from mindsponge.optimizer import SteepestDescent\n",
    "from mindsponge.control import VelocityVerlet\n",
    "from mindsponge.callback import WriteH5MD, RunInfo\n",
    "from mindsponge.control import Langevin\n",
    "from mindsponge.sampling import Metadynamics\n",
    "from mindsponge.function import VelocityGenerator\n",
    "from mindsponge.colvar import Torsion\n",
    "from mindsponge.function import PI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "context.set_context(mode=context.PYNATIVE_MODE, device_target=\"GPU\")\n",
    "set_global_units('nm', 'kj/mol')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "system = Protein(pdb='alad.pdb')\n",
    "potential = ForceField(system, 'AMBER.FF14SB')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "phi = Torsion([4, 6, 8, 14])\n",
    "psi = Torsion([6, 8, 14, 16])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[MindSPONGE] Using fully connected neighbour list (not updated).\n"
     ]
    }
   ],
   "source": [
    "min_opt = SteepestDescent(system.trainable_params(), 1e-7)\n",
    "mini = Sponge(system, potential, min_opt, metrics={'phi': phi, 'psi': psi})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[MindSPONGE] Started simulation at 2023-05-18 15:38:44\n",
      "[MindSPONGE] Step: 0, E_pot: -55.75643, phi: -3.140886, psi: -3.1410766\n",
      "[MindSPONGE] Step: 10, E_pot: -58.40555, phi: -3.1340268, psi: -3.1368413\n",
      "[MindSPONGE] Step: 20, E_pot: -60.168476, phi: -3.1277595, psi: -3.1337605\n",
      "[MindSPONGE] Step: 30, E_pot: -61.549706, phi: -3.1221528, psi: -3.131402\n",
      "[MindSPONGE] Step: 40, E_pot: -62.696198, phi: -3.1171532, psi: -3.1295478\n",
      "[MindSPONGE] Step: 50, E_pot: -63.674084, phi: -3.112676, psi: -3.1280725\n",
      "[MindSPONGE] Step: 60, E_pot: -64.52254, phi: -3.1086385, psi: -3.1268952\n",
      "[MindSPONGE] Step: 70, E_pot: -65.268196, phi: -3.1049676, psi: -3.1259575\n",
      "[MindSPONGE] Step: 80, E_pot: -65.93031, phi: -3.1016028, psi: -3.1252148\n",
      "[MindSPONGE] Step: 90, E_pot: -66.52346, phi: -3.0984938, psi: -3.1246324\n",
      "[MindSPONGE] Finished simulation at 2023-05-18 15:38:48\n",
      "[MindSPONGE] Simulation time: 3.72 seconds.\n",
      "--------------------------------------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<mindsponge.core.sponge.Sponge at 0x7fb2d81a2a90>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run_info = RunInfo(10)\n",
    "mini.run(100, callbacks=[run_info])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[WARNING] PRE_ACT(1334564,7fb2dc248500,python):2023-05-18-15:38:51.435.339 [mindspore/ccsrc/common/mem_reuse/mem_dynamic_allocator.cc:255] CalMemBlockAllocSize] Memory not enough: current free memory size[5308416] is smaller than required size[299635200].\n"
     ]
    }
   ],
   "source": [
    "metad = Metadynamics(\n",
    "    colvar=[phi, psi],\n",
    "    update_pace=10,\n",
    "    height=2.5,\n",
    "    sigma=0.05,\n",
    "    grid_min=-PI,\n",
    "    grid_max=PI,\n",
    "    grid_bin=360,\n",
    "    temperature=300,\n",
    "    bias_factor=100,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[MindSPONGE] Using fully connected neighbour list (not updated).\n"
     ]
    }
   ],
   "source": [
    "sim = WithEnergyCell(system, potential, bias=metad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "vgen = VelocityGenerator(300)\n",
    "velocity = vgen(system.shape, system.atom_mass)\n",
    "opt = UpdaterMD(\n",
    "    system,\n",
    "    integrator=VelocityVerlet(system),\n",
    "    thermostat=Langevin(system, 300),\n",
    "    time_step=1e-3,\n",
    "    velocity=velocity\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "md = Sponge(sim, optimizer=opt, metrics={'phi': phi, 'psi': psi})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[MindSPONGE] Started simulation at 2023-05-18 15:38:55\n",
      "[MindSPONGE] Step: 0, E_pot: -67.058876, E_kin: 0.0, E_tot: -67.058876, Temperature: 0.0, phi: -3.0957475, psi: -3.1241677\n",
      "[MindSPONGE] Step: 10, E_pot: 663.6504, E_kin: 708.6173, E_tot: 1372.2677, Temperature: 2705.6213, phi: -3.0849383, psi: -3.1222496\n",
      "[MindSPONGE] Step: 20, E_pot: 1978.3878, E_kin: 2713.9036, E_tot: 4692.2915, Temperature: 10362.1455, phi: -3.135781, psi: 2.9905124\n",
      "[MindSPONGE] Step: 30, E_pot: 2066.9265, E_kin: 2190.066, E_tot: 4256.992, Temperature: 8362.044, phi: 3.125073, psi: 2.7188087\n",
      "[MindSPONGE] Step: 40, E_pot: 2583.5564, E_kin: 2501.6257, E_tot: 5085.182, Temperature: 9551.632, phi: -2.9243853, psi: 2.4907224\n",
      "[MindSPONGE] Step: 50, E_pot: 113907310000.0, E_kin: 21849186.0, E_tot: 113929160000.0, Temperature: 83423900.0, phi: -0.17568907, psi: 2.0777006\n",
      "[MindSPONGE] Step: 60, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 70, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 80, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 90, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 100, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 110, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 120, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 130, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 140, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 150, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 160, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 170, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 180, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 190, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 200, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 210, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 220, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 230, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 240, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 250, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 260, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 270, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 280, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 290, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 300, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 310, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 320, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 330, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 340, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 350, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 360, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 370, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 380, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 390, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 400, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 410, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 420, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 430, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 440, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 450, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 460, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 470, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 480, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 490, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 500, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 510, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 520, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 530, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 540, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 550, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 560, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 570, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 580, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 590, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 600, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 610, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 620, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 630, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 640, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 650, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 660, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 670, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 680, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 690, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 700, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 710, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 720, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 730, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 740, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 750, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 760, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 770, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 780, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 790, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 800, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 810, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 820, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 830, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 840, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 850, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 860, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 870, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 880, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 890, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 900, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 910, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 920, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 930, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 940, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 950, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 960, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 970, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 980, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Step: 990, E_pot: nan, E_kin: nan, E_tot: nan, Temperature: nan, phi: nan, psi: nan\n",
      "[MindSPONGE] Finished simulation at 2023-05-18 15:39:33\n",
      "[MindSPONGE] Simulation time: 37.71 seconds.\n",
      "--------------------------------------------------------------------------------\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<mindsponge.core.sponge.Sponge at 0x7fb2d82e5fd0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cb_h5md = WriteH5MD(system, 'tutorial_a02.h5md', save_freq=10)\n",
    "md.run(1000, callbacks=[run_info, cb_h5md])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mindspore-1.10",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
